Exploiting path mapping for web cache deception
Web cache deception por path mapping: las rutas que terminan en .js se cachean (max-age=30) aunque el origin las sirva como páginas dinámicas; se captura la API key de carlos cacheando /my-account.
Target Overview & Vulnerability Summary
El lab web-cache-deception/lab-wcd-exploiting-path-mapping combina un mapping de rutas por regex y una caché que respeta ese mapping: las URLs que terminan en .js se cachean (TTL max-age=30). El origin, sin embargo, resuelve /my-account/wcd.js a la página de cuenta (el path mapping del framework usa la primera ruta coincidente, no la extensión). Al hacer que carlos visite la URL deceptiva, la respuesta con su API key queda cacheada y es recuperable.
| Campo | Valor |
|---|---|
| Severidad | Alta (exfiltración de datos autenticados vía caché pública) |
| Endpoint vulnerable | /my-account (cacheado bajo /my-account/wcd.js) |
| Root cause | Mapping de rutas por regex: la extensión .js hace cacheable un recurso que el origin resuelve como página dinámica |
Credenciales del laboratorio: wiener:peter. Requiere conocimientos de mapping de rutas por regex y de discrepancias cache/origin en el path mapping.
Technical Breakdown & Exploitation Flow
1. Reconocimiento de la caché
Tras el login, la ruta /my-account lista la API key — el target de la deception. Al probar requests sobre la caché se observa:
X-Cache: miss— la caché contactó con el origin para obtener el valor.X-Cache: hit— la caché sirvió el valor almacenado.Cache-Control: max-age=30— el asset se almacena 30 segundos.
2. El path mapping defectuoso
Las URLs que terminan en un formato de resource (.css, .js, etc.) reciben comportamiento de caching en la respuesta, aunque el origin las sirva como páginas dinámicas. El mapping de rutas del framework resuelve /my-account/wcd.js a la misma página /my-account (el endpoint de cuenta matchea por prefijo/estructura, no por extensión), pero la caché clasifica el recurso como estático por su terminación.
3. Construcción del exploit
<script>
document.location = "https://YOUR-LAB-ID.web-security-academy.net/my-account/wcd.js"
</script>
Flujo de explotación:
- La víctima (
carlos) visita el exploit server y su navegador navega a/my-account/wcd.js. - El origin resuelve la ruta al endpoint de cuenta y devuelve la página con la API key de
carlos. - La caché, por el mapping de extensión
.js, almacena la respuesta (X-Cachepasa ahit,max-age=30). - Dentro de la ventana de 30 s, el atacante solicita
/my-account/wcd.jsy obtiene el perfil cacheado decarloscon su API key.
Root Cause Analysis
La causa raíz es el mapping de rutas por regex que trata la extensión del path como criterio de cacheabilidad, mientras el framework de la app resuelve la misma ruta como un recurso dinámico. La regla de caché se basa en la forma de la URL (terminación .js) sin consultar qué endpoint sirvió realmente la respuesta. Cuando el path mapping hace colisionar una extensión estática con una ruta dinámica, la caché almacena contenido autenticado que debió tratarse como privado.
Secure Remediation
- Basar la cacheabilidad en el tipo de contenido y el endpoint servido, no en la extensión del path:
# Regla correcta: cachear solo si el origin respondió un asset estático real
if response.content_type in ("application/javascript", "text/css") and no_session(response):
cache(response)
- Normalizar el path antes del mapping:
/my-account/wcd.jsno debe matchear el endpoint/my-accountcomo página, o debe rechazarse por no ser un asset real. - Emitir
Cache-Control: private, no-storeen/my-accounty demás endpoints autenticados. - Configurar la caché para no cachear respuestas con cookies de sesión ni
Set-Cookie.